package com.gxc.integer;

/**
 *12. 整数转罗马数字
 * 七个不同的符号代表罗马数字，其值如下：
 *
 * 符号	值
 * I	1
 * V	5
 * X	10
 * L	50
 * C	100
 * D	500
 * M	1000
 * 罗马数字是通过添加从最高到最低的小数位值的转换而形成的。
 * 将小数位值转换为罗马数字有以下规则：
 *
 * 如果该值不是以 4 或 9 开头，
 * 请选择可以从输入中减去的最大值的符号，
 * 将该符号附加到结果，减去其值，
 * 然后将其余部分转换为罗马数字。
 * 如果该值以 4 或 9 开头，使用 减法形式，表示从以下符号中减去一个符号，
 * 例如 4 是 5 (V) 减 1 (I): IV ，9 是 10 (X) 减 1 (I)：IX。
 * 仅使用以下减法形式：4 (IV)，9 (IX)，40 (XL)，90 (XC)，400 (CD) 和 900 (CM)。
 * 只有 10 的次方（I, X, C, M）最多可以连续附加 3 次以代表 10 的倍数。
 * 你不能多次附加 5 (V)，50 (L) 或 500 (D)。
 * 如果需要将符号附加4次，请使用减法形式。
 * 给定一个整数，将其转换为罗马数字。
 */
public class IntToRoman {

    public static void main(String[] args) {
        int num = 3749;
        System.out.println(handle(num));
        num = 58;
        System.out.println(handle(num));
        num = 1994;
        System.out.println(handle(num));
    }

    public static String handle(int num) {
        int digit = 0;
        int a = num;
        while (a!=0) {
            a = a/10;
            digit++;
        }
        StringBuffer buffer = new StringBuffer();
        int n = 0;
        while (digit>0) {
            int pow = (int) Math.pow(10, digit - 1);
            n = num/ pow;
            buffer.append(intToStr(n, digit));
            num = num - n * pow;
            digit--;
        }
        return buffer.toString();
    }

    public static String intToStr(int num, int digit) {
        if (num == 4) {
            if (digit == 3) return "CD";
            else if (digit == 2) return "XL";
            else  return "IV";
        } else if (num == 9){
            if (digit == 3) return "CM";
            else if (digit == 2) return "XC";
            else  return "IX";
        } else if (num>=5) {
            String str = "";
            if (digit == 3) {
                str += "D";
                for (int i = 0; i < num-5; i++) {
                    str += "C";
                }
            } else if (digit == 2) {
                str += "L";
                for (int i = 0; i < num-5; i++) {
                    str += "X";
                }
            } else if (digit == 1) {
                str += "V";
                for (int i = 0; i < num-5; i++) {
                    str += "I";
                }
            }
            return str;
        } else {
            String str = "";
            for (int i = 0; i < num; i++) {
                if (digit == 4) {
                    str += "M";
                } else if (digit == 3) {
                    str += "C";
                } else if (digit == 2) {
                    str += "X";
                } else if (digit == 1) {
                    str += "I";
                }
            }
            return str;
        }
    }

    //官方解
    class Solution {
        int[] values = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
        String[] symbols = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};

        public String intToRoman(int num) {
            StringBuffer roman = new StringBuffer();
            for (int i = 0; i < values.length; ++i) {
                int value = values[i];
                String symbol = symbols[i];
                while (num >= value) {
                    num -= value;
                    roman.append(symbol);
                }
                if (num == 0) {
                    break;
                }
            }
            return roman.toString();
        }
    }


}
